﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Grishko.SerilizeTools;
using System.Xml;
using System.Reflection;

namespace Grishko.DataTier.SqlSentence
{
    /// <summary>
    /// Базовый класс всех списков 
    /// 
    /// </summary>
    public class ObjectWhere_EntityList:EntityList 
    {
        protected ScriptEngine _ListWhere =null;

        public virtual ScriptEngine ListWhere { get { return _ListWhere; } set { _ListWhere = value; } }    
                
        public override void Load()
        {
            SecuretyContext SC = AppContext.GetSC();
            try
            {
                if (null == _ListWhere) return;

                string sql = _ListWhere.GetScript();

                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
                cmd.CommandText = sql;
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.Connection = SC.Connection;
                SC.Connection.Open();
                XmlReader r = cmd.ExecuteXmlReader();
                if (null == r) return;
                XmlDocument d = new XmlDocument();
                d.Load(r);
                if (null == d.FirstChild) return;
                this.Clear();
                this.ReadXml(d.FirstChild);      
                
                //объекты приходят непрогуженные - прогружаем 
                foreach (Entity item in this) 
                                    item.PropertyLoad ();
            }

            catch(Exception e)
            {
                ;
            }
            finally
            {
                SC.Connection.Close();
            }
        }
        
        //internal override void WriteXml(XmlWriter writer, string ObjectName, bool Full)
        //{
        //    Type MyType = this.GetType();

        //    writer.WriteStartElement(ObjectName);
        //    //// Обязательно пишем тип и сборку 
        //    writer.WriteAttributeString(SerilizeContext.TypePref, MyType.ToString());
        //    writer.WriteAttributeString(SerilizeContext.AssemblyPref, MyType.Assembly.ToString());


        //    // пишем примитивные типы 
        //    foreach (PropertyInfo inf in AttPropertiesList)
        //    {
        //        object v = inf.GetValue(this, null);
        //        if (null == v) continue;
        //        if (String.IsNullOrEmpty(v.ToString())) continue;
        //        writer.WriteAttributeString(inf.Name, v.ToString());
        //    }
            
        //    //Пишем ListWhere
        //    _ListWhere.WriteXml(writer, "ListWhere", true);

        //    // конец узла
        //    writer.WriteEndElement();
        //}

    }
}
